const defaults = {
    timeout:0
}
class Axios {
    constructor(instanceConfig={}) {
        this.defaults = instanceConfig
    }
    // configOrUrl:地址或配置对象
    // config:配置对象
    request(configOrUrl={},config={}){
        // 第二个参数是配置对象
        if(typeof configOrUrl === "string"){
            config.url = configOrUrl;
        }else config = configOrUrl;

        // 合并配置对象
        config = {
            ...this.defaults,
            ...config
        }
        // 设置请求方式
        config.method = (config.method || "get").toLowerCase();

        // 使用baseURL
        if(config.baseURL && !config.url.startsWith("http://")){
            config.url = config.baseURL+config.url;
        }

        // params:{age:12,sex:"男“}======> age=12&sex=男
        if(config.params){
            config.url = config.url+"?"+Object.keys(config.params).map(key=>key+"="+config.params[key]).join("&")
        }

        // 发送ajax请求
        const _dispatchRequest = function(){
            return new Promise(function(resolve,reject){
                const request = new XMLHttpRequest();
                // 指定响应体的格式为json
                request.responseType = "json";
                request.open(config.method,config.url);
                request.send();
                // 响应体信息
                request.onload = function(){
                    // 当响应体信息接收完毕之后执行
                    resolve({
                        config,// 配置对象
                        data:request.response,// 响应体
                        headers:request.getAllResponseHeaders(),// 响应头
                        request,
                        status:request.status,
                        statusText:request.statusText
                    })
                }
            })

        }
        return _dispatchRequest();
    }
}
function createInstance(defaultConfig){
    const context = new Axios(defaultConfig);
    const instance = Axios.prototype.request.bind(context);
    // 复制context属性至instance当中
    for(let key in context){
        instance[key] = context[key];
    }
    return instance;
}
const axios = createInstance(defaults);
export default axios;